﻿using System;
using System.Configuration;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;
using System.Xml;
using Core.Library;
using DataObject;
using DataObject.Cart;
using DataObject.Category;
using DataObject.Customer;
using DataObject.Order;
using DataObject.OrderDetail;
using DataObject.Product;

public partial class Controls_ShoppingCart_Cart : System.Web.UI.UserControl
{
    protected int CustomerId;
    protected CustomerObject Customer;

    protected void Page_Load(object sender, EventArgs e)
    {
        rfvFullname.ErrorMessage        = "(*) - Nhập họ tên";
        rfvAddress.ErrorMessage         = "(*) - Nhập địa chỉ";
        rfvMobile.ErrorMessage          = "(*) - Nhập số điện thoại";
        rfvEmail.ErrorMessage           = "(*) - Nhập địa chỉ hòm thư";
        revEmail.ErrorMessage           = "(*) - Hòm thư sai";

        if (HttpContext.Current.Session["e3group.denhongphuc.customer"] != null)
        {
            Customer    = (CustomerObject)Session["e3group.denhongphuc.customer"];
            CustomerId  = Customer.CustomerId;
            lbCheckOut.Visible = true;
        }

        if (!IsPostBack)
            ListCart();

        Page.Title = string.Format(".: Giỏ hàng {0} :.", Constants.SITE_TITLE);    
    }

    protected void ListCart()
    {
        rptCart.DataSource = ShoppingCart.Instance.Items;
        rptCart.DataBind();
        ltTotalCart.Text = Utils.FormatPrice(ShoppingCart.Instance.GetSubTotal());
    }

    protected void rptCart_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var ltName      = (Literal) e.Item.FindControl("ltName");
            var ltTotalItem = (Literal) e.Item.FindControl("ltTotalItem");

            var productId = ConvertUtility.ToInt32(((HiddenField) e.Item.FindControl("hfProduct")).Value);
            var quantity  = ConvertUtility.ToInt32(((TextBox) e.Item.FindControl("txtQuantity")).Text);

            var o = ProductController.Product_GetById(productId);
            if (o != null)
            {
                ltName.Text = string.Format("<a href=\"{0}\" class=\"colr\">{1}</a><p>{2}</p>", 
                                                UrlHelpers.ProductDetail(CategoryController.GetCategoryName(o.CategoryId), o.ProductId, o.Name),
                                                o.Code, o.Name);

                if (productId > 0 && quantity > 0)
                    ltTotalItem.Text = Utils.FormatPrice(ConvertUtility.ToDecimal(o.UnitPrice * quantity));
            }
        }
    }

    protected void rptCart_ItemCommand(object sender, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "Remove")
        {
            var productId = Convert.ToInt32(e.CommandArgument);
            ShoppingCart.Instance.RemoveItem(productId);
        }

        ListCart();        
    }    

    protected void BtnContinueShopping(object sender, EventArgs e)
    {
        Response.Redirect(Session["ReturnUrl"] != null
                              ? HttpUtility.HtmlDecode(Session["ReturnUrl"].ToString())
                              : UrlHelpers.Home);
    }

    protected void BtnUpdateCart(object sender, EventArgs e)
    {
        foreach (RepeaterItem row in rptCart.Items)
        {
            if (row.ItemType == ListItemType.Item || row.ItemType == ListItemType.AlternatingItem)
            {
                try
                {
                    var productId = ConvertUtility.ToInt32(((HiddenField)row.FindControl("hfProduct")).Value);                    
                    var quantity  = ConvertUtility.ToInt32(((TextBox)row.FindControl("txtQuantity")).Text);

                    if (productId > 0 && quantity > 0)  
                        ShoppingCart.Instance.SetItemQuantity(productId, quantity);    
                }
                catch (Exception ex) { throw new Exception("Update Cart: " + ex.Message);}
            }
        }

        ListCart();        
    }

    // Gửi đơn hàng có tài khoản trong hệ thống
    protected void LbCheckOut(object sender, EventArgs e)
    {
        if (HttpContext.Current.Session["e3group.denhongphuc.customer"] != null)
            SendOrder(Customer.CustomerId, Customer.Email, Customer.ContactName, Customer.Email, Customer.Mobile, Customer.Address);            
        else
            ltMessage.Text = MessageUtility.ShowMessage(string.Empty, "Bạn cần chọn sản phẩm trước khi gửi đơn hàng.", MessageType.Warning);

        ShoppingCart.Instance.Items.Clear();
    }

    // Không có tài khoản trong hệ thống (* Khách vãng lai)
    protected void BtnSend(object sender, EventArgs e)
    {
        SendOrder(0, ConfigurationManager.AppSettings["MailTo"], txtFullName.Text, txtEmail.Text, txtMobile.Text, txtAddress.Text);
        ShoppingCart.Instance.Items.Clear();
    }   
 
    // Đặt hàng và Gửi mail cho khách hàng
    private void SendOrder(int customerId, string contact, string fullName, string email, string mobile, string address)
    {
        if (ShoppingCart.Instance.GetSubTotal() > 0)
        {
            #region Send Mail
                        
            var count = 0;
            decimal totalValue = 0;

            var doc = new XmlDocument();
            doc.Load(Server.MapPath("App_Data/Order.xml"));
            var node = doc.SelectSingleNode("emails/email[@id='Order']");
            // Set info from xml file in to email   
            var childNode = node.SelectSingleNode("subject");

            // Subject: ...
            var subject = string.Format("Thông tin đơn hàng - www.denhongphuc.vn - Thời gian {0}", DateTimeFunctions.FormatIn_HHMM_DDMMYYYY(DateTime.Now));
            // Body: ...
            childNode = node.SelectSingleNode("body");
            var Body = childNode.InnerText;

            Body = Body.Replace("[Subject]", subject);
            Body = Body.Replace("[FName]", fullName);
            Body = Body.Replace("[Address]", address);
            Body = Body.Replace("[Email]", email);
            Body = Body.Replace("[PhoneNo]", mobile);
            Body = Body.Replace("[Note]", txtNote.Text);

            #endregion

            var sb = new StringBuilder();
            
            //1. Khách vãng lai thì sẽ tạo mới khách hàng 
            //2. Khác hàng này không được kích hoạt để tránh trùng với Email trong hệ thống khách hàng đang kích hoạt
            if (customerId == 0)
            {
                var c = new CustomerObject();
                c.ContactName   = txtFullName.Text;
                c.Username      = "Khách lẻ";
                c.Password      = string.Empty;
                c.Mobile        = txtMobile.Text;
                c.Email         = txtEmail.Text;
                c.Address       = txtAddress.Text;
                c.IsActive      = false;

                customerId = CustomerController.Customer_Create(c);    
            }

            if (customerId > 0)
            {
                sb.Append("<table width=\"500\" border=\"1\" cellspacing=\"0\" cellpadding=\"5\">");
                sb.Append("<tr>");
                sb.Append("<th>STT</td>");
                sb.Append("<td>Mã và tên sản phẩm</td>");
                sb.Append("<td align=\"right\">Số lượng</td>");
                sb.Append("<td align=\"right\">Giá</td>");
                sb.Append("</tr>");

                var o = new OrderObject();
                o.CustomerId    = customerId;
                o.Status        = (int)OrderStatus.OrderTemp;
                o.TotalValue    = ShoppingCart.Instance.GetSubTotal();
                o.OrderDate     = DateTime.Now;
                o.RequiredDate  = DateTime.MaxValue;
                o.Note          = txtNote.Text;

                var orderId = OrderController.Order_Create(o);
                if (orderId > 0)
                {
                    foreach (RepeaterItem row in rptCart.Items)
                    {
                        count++;

                        var productId = ConvertUtility.ToInt32(((HiddenField)row.FindControl("hfProduct")).Value);
                        var quantity = ConvertUtility.ToInt32(((TextBox)row.FindControl("txtQuantity")).Text);

                        if (productId > 0 && quantity > 0)
                        {
                            var product = ProductController.Product_GetById(productId);
                            var category = CategoryController.Category_GetById(product.CategoryId);
                            if (category != null)
                            {
                                sb.Append("<tr>");
                                sb.AppendFormat("<td align=\"center\">{0}</td>", count);
                                sb.AppendFormat("<td align=\"left\">{0} - {1}</td>", product.Code, product.Name);
                                sb.AppendFormat("<td align=\"right\">{0}</td>", Utils.FormatPrice(quantity));
                                sb.AppendFormat("<td align=\"right\">{0}</td>", Utils.FormatPrice(product.UnitPrice));
                                sb.Append("</tr>");

                                totalValue += quantity * product.UnitPrice;

                                var od = new OrderDetailObject();
                                od.OrderId = orderId;
                                od.ParentId = category.ParentId;
                                od.CategoryId = product.CategoryId;
                                od.ProductId = productId;
                                od.Quantity = quantity;
                                od.UnitPrice = product.UnitPrice;
                                od.Discount = 0;

                                OrderDetailController.OrderDetail_Create(od);
                            }
                        }
                    }
                }

                ltMessage.Text = MessageUtility.ShowMessage(string.Empty,
                                                            "Đơn hàng của bạn đã gửi thành công. Chúng tôi sẽ liên hệ với bạn trong thời gian sớm nhất",
                                                            MessageType.Information);

                sb.Append("<tr>");
                sb.AppendFormat("<td colspan=\"4\" align=\"right\">Tổng tiền: {0}</td>", Utils.FormatPrice(totalValue));
                sb.Append("</tr>");
                sb.Append("</table>");

                Body = Body.Replace("[Message]", sb.ToString());
                MailUtility.Send(contact, subject, Body);

                //var checkMail = MailUtility.Send(contact, subject, Body);
                //ltMessage.Text = checkMail
                //                     ? MessageUtility.ShowMessage(
                //                         string.Empty,
                //                         "Đơn hàng của bạn đã gửi thành công. Chúng tôi sẽ liên hệ với bạn trong thời gian sớm nhất", MessageType.Information)
                //                     : MessageUtility.ShowMessage(
                //                         string.Empty, "Xin vui lòng gửi đơn hàng sau.", MessageType.Failure);    
            }            
        }
        else
            ltMessage.Text = MessageUtility.ShowMessage(string.Empty, "Bạn cần chọn sản phẩm trước khi gửi đơn hàng.", MessageType.Warning);        
    }

}